#ifndef PID_H
#define PID_H

#include <stdint.h>
#include <stdbool.h>

// PID控制器结构体
typedef struct {
    // 增益参数
    float Kp; // 比例增益
    float Ki; // 积分增益
    float Kd; // 微分增益

    // 设定点
    float setpoint;

    // 状态变量
    float integral;     // 积分项累计值
    float prev_error;   // 上一次的误差

    // 输出限制
    float output_min;   // 输出最小值
    float output_max;   // 输出最大值

    // 时间相关
    uint32_t last_time; // 上次计算时间
    float sample_time;  // 采样时间（秒）

    // 初始化标志
    bool initialized;

} PID_Controller;

/**
 * @brief 初始化PID控制器
 * @param pid 指向PID控制器实例的指针
 * @param Kp 比例增益
 * @param Ki 积分增益
 * @param Kd 微分增益
 * @param sample_time 采样时间（秒）
 */
void PID_Init(PID_Controller *pid, float Kp, float Ki, float Kd, float sample_time);

/**
 * @brief 更新PID计算
 * @param pid 指向PID控制器实例的指针
 * @param setpoint 期望设定值
 * @param measurement 当前测量值
 * @return PID控制器的输出值
 */
float PID_Update(PID_Controller *pid, float setpoint, float measurement);

/**
 * @brief 设置PID增益参数
 * @param pid 指向PID控制器实例的指针
 * @param Kp 比例增益
 * @param Ki 积分增益
 * @param Kd 微分增益
 */
void PID_SetTunings(PID_Controller *pid, float Kp, float Ki, float Kd);

/**
 * @brief 设置PID输出限制
 * @param pid 指向PID控制器实例的指针
 * @param min 输出最小值
 * @param max 输出最大值
 */
void PID_SetOutputLimits(PID_Controller *pid, float min, float max);

/**
 * @brief 重置PID控制器状态
 * @param pid 指向PID控制器实例的指针
 */
void PID_Reset(PID_Controller *pid);

#endif // PID_H
